home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Delphi Informant Complete 1995 - 2000
/
Delphi Informant Complete 1995 to 2000.iso
/
Delphi Informant Magazine Complete Works SOURCE CODE 1998.rar
/
1998
/
Feb
/
di9802kw
/
WebPics1.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1997-08-19
|
11KB
|
363 lines
unit WebPics1;
{
Extract a picture from a database and display it on the web.
Written by Keith Wood, 12 Aug 1997.
}
interface
uses
Windows, Messages, SysUtils, Classes, HTTPApp, Db, DBTables, Registry;
type
TwmdWebPics = class(TWebModule)
qryWebPics: TQuery;
dbsWebPics: TDatabase;
wppListSchemes: TPageProducer;
wppAddScheme: TPageProducer;
wppUpdateScheme: TPageProducer;
procedure wmdWebPicsCreate(Sender: TObject);
procedure wmdWebPicsDestroy(Sender: TObject);
procedure wmdWebPicswacGetPicAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
procedure wmdWebPicswacConfigureAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
procedure wppListSchemesHTMLTag(Sender: TObject; Tag: TTag;
const TagString: String; TagParams: TStrings;
var ReplaceText: String);
procedure wppAddSchemeHTMLTag(Sender: TObject; Tag: TTag;
const TagString: String; TagParams: TStrings;
var ReplaceText: String);
procedure wppUpdateSchemeHTMLTag(Sender: TObject; Tag: TTag;
const TagString: String; TagParams: TStrings;
var ReplaceText: String);
private
{ Private declarations }
slsHTTPFields: TStrings;
regSchemes: TRegistry;
sSchemeId: String;
sSchemeName: String;
sAliasName: String;
sUserId: String;
sPassword: String;
slsOtherParams: TStringList;
sTableName: String;
sKeyField: String;
sBlobField: String;
sTypeField: String;
procedure SetFields;
function LoadScheme(sId: String): Boolean;
function Coded(sPassword: String): String;
procedure DeleteScheme;
procedure AddScheme;
procedure UpdateScheme;
procedure SaveScheme(sSchemeId: String);
public
{ Public declarations }
end;
var
wmdWebPics: TwmdWebPics;
implementation
{$R *.DFM}
const
sRegKey = '\Software\Kwood\WebPics';
sNameKey = 'SchemeName';
sAliasKey = 'AliasName';
sUserKey = 'UserId';
sPasswordKey = 'Password';
sOtherKey = 'OtherParams';
sTableKey = 'TableName';
sKeyKey = 'KeyField';
sBlobKey = 'BlobField';
sTypeKey = 'TypeField';
{ Initialisation }
procedure TwmdWebPics.wmdWebPicsCreate(Sender: TObject);
begin
regSchemes := TRegistry.Create;
slsOtherParams := TStringList.Create;
end;
{ Free resources }
procedure TwmdWebPics.wmdWebPicsDestroy(Sender: TObject);
begin
regSchemes.Free;
slsOtherParams.Free;
end;
{ Set pointer to request fields depending on request method }
procedure TwmdWebPics.SetFields;
begin
if Request.MethodType = mtPost then
slsHTTPFields := Request.ContentFields
else
slsHTTPFields := Request.QueryFields;
end;
{ Load details about a scheme from the registry }
function TwmdWebPics.LoadScheme(sId: String): Boolean;
begin
Result := True;
with regSchemes do
try
if not OpenKey(sRegKey + '\' + sId, False) then
Abort;
sSchemeId := sId;
sSchemeName := ReadString(sNameKey);
sAliasName := ReadString(sAliasKey);
sUserId := ReadString(sUserKey);
sPassword := Coded(ReadString(sPasswordKey));
slsOtherParams.Text := ReadString(sOtherKey);
sTableName := ReadString(sTableKey);
sKeyField := ReadString(sKeyKey);
sBlobField := ReadString(sBlobKey);
sTypeField := ReadString(sTypeKey);
except
Result := False;
end;
end;
{ En/decode password field }
function TwmdWebPics.Coded(sPassword: String): String;
var
i: Integer;
begin
Result := '';
for i := 1 to Length(sPassword) do
Result := Result + Chr(160 - Ord(sPassword[i]));
end;
{ Extract a picture from the database and return it }
procedure TwmdWebPics.wmdWebPicswacGetPicAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
sSelect: String;
stmHeader: TStringStream;
begin
SetFields;
{ Check for valid scheme }
if not LoadScheme(slsHTTPFields.Values['SCHEME']) then
Response.StatusCode := 400
else
begin
{ Initialise database with scheme details }
with dbsWebPics do
begin
AliasName := sAliasName;
Params.Clear;
if sUserId <> '' then
Params.Add('username=' + sUserId);
if sPassword <> '' then
Params.Add('password=' + sPassword);
if slsOtherParams.Count > 0 then
Params.AddStrings(slsOtherParams);
Open;
end;
{ Find the required record and extract the image }
with Response, qryWebPics do
try
sSelect := sBlobField;
if sTypeField <> '' then
sSelect := sSelect + ', ' + sTypeField;
SQL.Clear;
SQL.Add('select ' + sSelect);
SQL.Add('from ' + sTableName);
SQL.Add('where ' + sKeyField + ' = ' + slsHTTPFields.Values['ID']);
Open;
try
ContentStream := TBlobStream.Create(TBlobField(FieldByName(sBlobField)), bmRead);
{ Set image type }
if sTypeField <> '' then
ContentType := FieldByName(sTypeField).AsString
else
begin
try
stmHeader := TStringStream.Create('');
stmHeader.CopyFrom(ContentStream, 0);
ContentStream.Position := 0;
if Pos('JFIF', Copy(stmHeader.DataString, 1, 10)) = 7 then
ContentType := 'image/jpeg'
else if Pos('GIF', Copy(stmHeader.DataString, 1, 10)) = 1 then
ContentType := 'image/gif';
finally
stmHeader.Free;
end;
end;
except
StatusCode := 500;
end;
except
StatusCode := 404;
end;
end;
end;
{ Configuration -------------------------------------------------------------- }
{ Accept request and perform configuration actions }
procedure TwmdWebPics.wmdWebPicswacConfigureAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
sAction: String;
begin
SetFields;
sAction := slsHTTPFields.Values['ACTION'];
{ Display a single scheme's details }
if sAction = 'Get' then
begin
if slsHTTPFields.Values['ID'] = '0' then
Response.Content := wppAddScheme.Content
else if LoadScheme(slsHTTPFields.Values['ID']) then
Response.Content := wppUpdateScheme.Content
else
Response.StatusCode := 400;
end
else
{ Apply changes to the registry (if applicable) and redisplay complete list }
begin
if sAction = 'Delete' then
DeleteScheme
else if sAction = 'Add' then
AddScheme
else if sAction = 'Update' then
UpdateScheme;
Response.Content := wppListSchemes.Content;
end;
end;
{ List all schemes }
procedure TwmdWebPics.wppListSchemesHTMLTag(Sender: TObject; Tag: TTag;
const TagString: String; TagParams: TStrings; var ReplaceText: String);
var
i: Integer;
slsKeys: TStringList;
begin
if TagString = 'SCRIPT' then
ReplaceText := Request.ScriptName
else if TagString = 'SCHEMES' then
begin
ReplaceText := '<p>No configurations schemes currently registered.</p>';
with regSchemes do
if OpenKey(sRegKey, False) then
begin
slsKeys := TStringList.Create;
try
GetKeyNames(slsKeys);
if slsKeys.Count = 0 then
Exit;
ReplaceText := '<table width=100%>'#13#10;
for i := 0 to slsKeys.Count - 1 do
if LoadScheme(slsKeys[i]) then
begin
ReplaceText := ReplaceText + '<tr><td>' + sSchemeId + '<td><a href="' +
Request.ScriptName + '/config?action=Get&id=' + sSchemeId + '">' +
sSchemeName + '</a>'#13#10 + '<td><a href="' + Request.ScriptName +
'/config?action=Delete&id=' + sSchemeId + '">Delete</a></tr>'#13#10;
end;
ReplaceText := ReplaceText + '</table>'#13#10;
finally
slsKeys.Free;
end;
end;
end;
end